/**
 * 
 */
package services.communication.chat;

import java.util.List;
import java.util.Map;
import java.util.Set;

import org.example.www.communication.ChatService.ChatRoom;
import org.example.www.communication.ChatService.CommunicationChatService_PortType;

/**
 * Interfaz que abstrae el comportamiento comun de un cliente de chat simple.<BR/>
 * Define matodos basicos para iniciar el cliente con un nombre de usuario
 * obtener una lista de los salones activos de chat, entrar a los salones,
 * enviar y recibir mensajes de los mismos y salir de estos.<BR/>
 * Deacuerdo al archivo que se utilice para instanciar mediante Spring, se
 * utilizara un proxy dinamico
 * (services.communication.chat._dynamic.communicationChatService.xml) o un
 * proxy hibrido
 * (services.communication.chat._hhybrid.communicationChatService.xml).
 * 
 * @author lito
 */
public interface SimpleChatClientIF {
	
	/**
	 * El intervalo de tiempo por defecto para solicitar los mensajes pendientes
	 * a cada sala de chat a la que este subscripto el cliente.
	 */
	public static final long	DEFAULT_REFRESH_TIME			= 100;
	
	/**
	 * Mensaje de error a utilizar cuando ocurre un excepcion remota al intentar
	 * obtener los salones de chat activos.
	 */
	public static final String			ERROR_MSG_GET_ACTIVE_CHAT_ROOMS	= "Ocurrio un error remoto al intentar obtener la lista de salones de chat activos del servidor.";
	
	/**
	 * Mensaje de error a utilizar cuando ocurre un excepcion remota al intentar
	 * entrar a un salon de chat.
	 */
	public static final String			ERROR_MSG_ENTER_CHAT_ROOMS		= "Ocurrio un error remoto al intentar entrar al salon.";
	
	/**
	 * Mensaje de error a utilizar cuando se quiere entrar a un salon l que y se
	 * esta suscripto.
	 */
	public static final String			ERROR_MSG_ALREADY_IN_CHAT_ROOMS	= "Se intento entrar a un salon al que ya se esta suscripto.";
	
	/**
	 * Mensaje de error a utilizar cuando ocurre un excepcion remota al intentar
	 * salirde un salon de chat.
	 */
	public static final String			ERROR_MSG_QUIT_CHAT_ROOMS		= "Ocurrio un error remoto al intentar salir de la sala de chat.";
	
	/**
	 * Mensaje de error a utilizar cuando ocurre un excepcion remota al intentar
	 * obtener los mensajes pendientes para las salas de chat.
	 */
	public final String				ERROR_MSG_RECIVE_PENDING_MSGS	= "Ocurrio un error remoto al recibir los mensajes pendientes del servidor de chat.";
	
	/**
	 * @return Un conjunto salas de chat.
	 * @throws RuntimeException
	 *         Si ocurre una excepcion remota al usar el proxy.
	 */
	public Set<ChatRoom> getActiveChatRooms();
	
	/**
	 * Entra a la sala de chat pasada como parametro, agregandola al conjunto
	 * inrno de salas de chat a las que se esta suscripto.
	 * 
	 * @param chatRoomID
	 *        El identificador de la sala a la cual se quiere entrar.
	 * @throws RuntimeException
	 *         Si ocurre una excepcion remota.<BR/>
	 *         Si se intenta entrar a una sala de chat a la que ya se esta
	 *         suscripto.
	 */
	public void enterChatRoom(String chatRoomID);
	
	/**
	 * Retira este cliente de la sala de chat pasada como parametro del servidor
	 * mediante el proxy. y quita la sala del conjunto de salas a las que este
	 * cliente esta suscripto.
	 * 
	 * @param chatRoomID
	 *        El identificador de la sala de la cual se quiere salir.
	 */
	public void quitChatRoom(String chatRoomID);
	
	/**
	 * Envia el mensaje al salon de chat especificado utilizando el proxy.
	 * 
	 * @param chatRoomID
	 *        El identificador del salon del chat al que se enviara el mensaje.
	 * @param msg
	 *        El mensaje a enviar.
	 * @return El mensaje que se veran los otros usuarios.
	 * @throws RuntimeException
	 *         Si ocurre una excepcion remota.
	 */
	public String sendMsg(String chatRoomID, String msg);
	
	/**
	 * Solicita a cada uno de los salones de chat a los cuales esta suscripto
	 * este cliente que le envien los mensajes pendientes. Con lo cual conforma
	 * una tabla de hash y la retorna.
	 * 
	 * @return Una tabla de hash con los mensajes pendientes para cada salon de
	 *         chat al que esta suscripto este cliente.
	 * @throws RuntimeException
	 *         Si ocurre un excepcion remota.
	 */
	public Map<String, List<String>> recivePendingMsgsPerChatRoom();
	
	/**
	 * @return El proxy para acceder al web-service de chat.
	 */
	public CommunicationChatService_PortType getChatServiceProxy();
	
	/**
	 * @param chatServiceProxy
	 *        El proxy para acceder al web-service de chat.
	 */
	public void setChatServiceProxy(
			CommunicationChatService_PortType chatServiceProxy);
	
	/**
	 * @return El identificador del usuario de este cliente de chat.
	 */
	public String getClientID();
	
	/**
	 * Si el parametro es distinto del id de cliente actual, se quita el cliente
	 * de las salas de chat a laas que este suscripto y se cambia el id; si no,
	 * no hace nada.
	 * 
	 * @param clientID
	 *        El identificador del usuario de este cliente de chat.
	 */
	public void setClientID(String clientID);
	
	/**
	 * @return Conjunto de salas de cha a las que este cliente esta suscripto.
	 */
	public Set<String> getRegisteredChatRooms();
	
}
